iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

在Perl裡。一般是@lines = <F>;來將檔案內容全存進陣列變數,若是$line = <F>則只存第一列。而想該$line涵蓋檔案所有內容,包括換行,必須先執行undef $/;才行。$/是換行變數,預設是\n,可以改變它為其它字符,而undef就是取消系統換行字元,就能使用鑽石符號<>一口氣讀進變數。
承昨天的用javaue.def的題目,用Perl跨行比對如下:

#!/usr/bin/perl
sub handleBlock {
    my $block = shift;
    @lines = split/\n/, $block;
    print $lines[0] . "\n";
}
undef $/;
open F, "./javaue.def" or die "$!";
$ctx = <F>;
close F;
while ($ctx =~ /(Definition for table .*?End of definition)/gs) {
     handleBlock($1);
}
  • $ctx變數內容就是所有javaue.def內容,因為前面執行了undef $/;,才能全數讀進$ctx。
  • 在用/ /跨行比對,g選項是全域,s選項是多列,最初一直以為是m,其實是s。
  • 利用迴圈逐一把比對符合的記憶小括號$1傳給自定的副程式handleBlock。

上一篇
Java跨行比對
下一篇
用Regex組SQL的insert與update欄位
系列文
正則!好好表達30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言